package com.example.springboot_04.custom;

import org.springframework.core.MethodParameter;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import java.util.Arrays;

public class ListHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    /**
     * 实现也比较简单，就是看参数上有没有前面定义的ListParam注解
     */
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(ListParam.class);
    }

    /**
     *主要是为了演示自定义参数解析器的过程，实现比较简单，默认只支持List<String>
     */
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        //获取传入的参数（parameter）上的ListParam注解。如果该参数上没有ListParam注解，那么listParm的值将为null。
        ListParam listParm = parameter.getParameterAnnotation(ListParam.class);
        if (listParm == null) {
            throw new IllegalArgumentException(
                    "Unknown parameter type [" + parameter.getParameterType().getName() + "]");
        }
        //如果ListParam注解的name属性为空字符串（""），则使用value属性作为参数名；否则，使用name属性作为参数名。
        String name = "".equalsIgnoreCase(listParm.name()) ? listParm.value(): listParm.name();
        if("".equalsIgnoreCase(name)){
            name = parameter.getParameter().getName();
        }
        String ans = webRequest.getParameter(name);
        if(ans == null){
            return null;
        }
        /*
          这里有可能发生NullPointerException
          http://localhost:8080/get/self1?names=wang,&age=12
          name参数必须携带 , 否则就会返回异常
         */
        String[] cells = StringUtils.split(ans, ",");
        return Arrays.asList(cells);
    }
}
